package 线程的学习;
/*
* 线程互斥的学习
*临界区加锁有两种格式
* */
public class Test {
    public static void main(String[] args) {

        Share share=new Share();
//        改成run方法并不会出现 不同，start 方法才是调用线程 运行的正确做法
        new AddThread(share).start();
        new DecThread(share).start();
        new DecThread(share).start();
    }

}
class Share{
    private int a;
    public Share(){
        a=0;
    }
    public Share(int d){
        this.a=d;
    }
    //临界区1，对共享数据加1
    public synchronized void add(){
        try{
            Thread.sleep(10);
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
        a=a+1;
        System.out.println("ADD:"+a);
//        临界区2,对共享数据进行减1操作

    }
    public  synchronized void dec(){
        if(a>0){
            try{
                Thread.sleep(10);
            }catch (Exception e){
                System.out.println(e.getMessage());
            }
            a=a-1;
            System.out.println("DEC:"+a);
        }
    }
}


//对共享数据做加一操作的线程
class AddThread extends Thread{
    private Share s1;
    public AddThread(Share s3){
        this.s1=s3;
    }
    public void run(){
        for(int i=0;i<=100;i++){
            s1.add();
        }
    }
}
//对共享数据做减一操作的线程
class DecThread extends Thread{
    private Share s1;
    public DecThread(Share s3){
        this.s1=s3;
    }
    public void run(){
        for(int i=0;i<=100;i++){
          try{
              Thread.sleep(10);
          }catch(Exception e){
              System.out.println(e.getMessage());
          }
            s1.dec();
        }
    }
}